package com.ykfk.cngrain.tbw.util;

import java.security.MessageDigest;

/**
 * 
 * @类名 Md5Util
 * @描述 Md5 生成工具
 * @作者 wdfang
 * @日期 2013-1-30 下午8:19:39
 * ========修改日志=======
 *
 */
public class Md5Util {
	private static Md5Util md5 = null;
	
	private static final String ALGORITHM = "MD5";
	private static MessageDigest md;
	/**
	 * 
	 * @名称 getInstants
	 * @描述 创建MD5使用单例
	 * @参数 @return
	 * @返回值 Md5Util
	 * @作者 wdfang
	 * @时间 2013-1-30 下午8:47:39
	 */
	public static Md5Util getInstants() {
		if (md5 == null) {
			md5 = new Md5Util();
		}
		return md5;
	}
	/**
	 * 
	 * @名称 getMD5Str
	 * @描述 得到MD5算法处理后的值
	 * @参数 @param password
	 * @参数 @return
	 * @返回值 String
	 * @作者 wdfang
	 * @时间 2013-1-30 下午8:44:22
	 */
	public String getMD5Str(String password) {
		char[] pw = new char[password.length()];
		for (int i = 0; i < pw.length; i++) {
			pw[i] = password.charAt(i);
		}

		try {
			return new String(cryptPassword(pw));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 
	 * @名称 getPersonalMD5Str
	 * @描述 经过自定义规则重复MD5轮转加工后的数值
	 * @参数 @param password
	 * @参数 @return
	 * @返回值 String
	 * @作者 wdfang
	 * @时间 2013-1-30 下午8:45:13
	 */
	public String getPersonalMD5Str(String password){
		for(int i=0;i<5;i++){
			if(password.length()>8){
				password += password.substring(0,8); 
			}
			password = getMD5Str(password);
			if(password == null)
				break;
		}
		return password;
	}
	
	private char[] hexDump(byte src[]) {
		char buf[] = new char[src.length * 2];
		for (int b = 0; b < src.length; b++) {
			String byt = Integer.toHexString(src[b] & 255);
			if (byt.length() < 2) {
				buf[b * 2 + 0] = '0';
				buf[b * 2 + 1] = byt.charAt(0);
			} else {
				buf[b * 2 + 0] = byt.charAt(0);
				buf[b * 2 + 1] = byt.charAt(1);
			}
		}
		return buf;
	}

//	private void smudge(char pwd[]) {
//		if (pwd != null) {
//			for (int b = 0; b < pwd.length; b++)
//				pwd[b] = '\0';
//		}
//	}

	private void smudge(byte pwd[]) {
		if (pwd != null) {
			for (int b = 0; b < pwd.length; b++)
				pwd[b] = 0;
		}
	}

	private char[] cryptPassword(char pwd[]) throws Exception {
		if (md == null)
			md = MessageDigest.getInstance(ALGORITHM);
		md.reset();
		byte pwdb[] = new byte[pwd.length];
		for (int b = 0; b < pwd.length; b++)
			pwdb[b] = (byte) pwd[b];

		char crypt[] = hexDump(md.digest(pwdb));
		smudge(pwdb);
		return crypt;
	}
}
